﻿/*
 * 文件功能描述：短信组件 EUCPComm.dll
 * 创建者：姜凌冬
 * 创建时间：2013-2-28 13:28:26
 * 
 * 修改时间：
 * 修改者：
 * 修改描述：
*/
using System;
using System.Collections.Generic;
using System.Web;
using System.Runtime.InteropServices;


    /// <summary>
    /// 短信组件 EUCPComm.dll
    /// </summary>
    public class EUCPComm
    {
        //调用dll方法
      
        [DllImport("EUCPComm.dll", EntryPoint = "SendSMSEx")]  //即时发送(扩展)
        public static extern int SendSMSEx(string sn, string mn, string ct, string addi, string priority);

        [DllImport("EUCPComm.dll", EntryPoint = "SendScheSMS")]  // 定时发送
        public static extern int SendScheSMS(string sn, string mn, string ct, string ti, string priority);

        [DllImport("EUCPComm.dll", EntryPoint = "SendScheSMSEx")]  // 定时发送(扩展)
        public static extern int SendScheSMSEx(string sn, string mn, string ct, string ti, string addi, string priority);

        //[DllImport("EUCPComm.dll",EntryPoint="ReceiveStatusReport")]  // 接收短信报告
        //public static extern int ReceiveStatusReport(string sn,delegSMSReport mySmsReport);  

        //[DllImport("EUCPComm.dll",EntryPoint="ReceiveStatusReportEx")]  // 接收短信报告(带批量ID)
        //public static extern int ReceiveStatusReportEx(string sn,delegSMSReportEx mySmsReportEx);  

        [DllImport("EUCPComm.dll", EntryPoint = "Register")]   // 注册 
        public static extern int Register(string sn, string pwd, string EntName, string LinkMan, string Phone, string Mobile, string Email, string Fax, string sAddress, string Postcode);

        [DllImport("EUCPComm.dll", EntryPoint = "ChargeUp")]  // 存值
        public static extern int ChargeUp(string sn, string acco, string pass);

        [DllImport("EUCPComm.dll", EntryPoint = "GetPrice")]  // 价格
        public static extern int GetPrice(string m, System.Text.StringBuilder balance);

        [DllImport("EUCPComm.dll", EntryPoint = "RegistryTransfer")]  //申请转接
        public static extern int RegistryTransfer(string sn, string mn);

        [DllImport("EUCPComm.dll", EntryPoint = "CancelTransfer")]  // 注销转接
        public static extern int CancelTransfer(string sn);

        [DllImport("EUCPComm.dll", EntryPoint = "UnRegister")]  // 注销
        public static extern int UnRegister(string sn);

        [DllImport("EUCPComm.dll", EntryPoint = "SetProxy")]  // 设置代理服务器 
        public static extern int SetProxy(string IP, string Port, string UserName, string PWD);

        [DllImport("EUCPComm.dll", EntryPoint = "RegistryPwdUpd")]  // 修改序列号密码
        public static extern int RegistryPwdUpd(string sn, string oldPWD, string newPWD);

        /// <summary>
        /// 发送即时短信。
        /// 发送短信到EUCP平台 (EUCP平台收到短信数据后，即时提交到短信网关) , 支持单发、群发。
        /// </summary>
        /// <param name="sn">软件序列号</param>
        /// <param name="mn">手机号码(群发时，建议最多一次发送200个手机号码之内,号码间用逗号分隔)</param>
        /// <param name="ct">短信内容(最多500个汉字或1000个纯英文，emay服务器程序能够自动分割；亿美有多个通道为客户提供服务，所以分割原则采用最短字数的通道为分割短信长度的规则，请客户应用程序不要自己分割短信以免造成混乱)</param>
        /// <param name="priority">优先级。可以定义1-5 共5个级别的优先级，其中1为最低优先级，5为最高优先级。</param>
        /// <returns>
        /// 1	短信发送成功（即代表短信已成功提交短信平台）
        /// 17	发送短信失败，失败原因：
        ///     1、	序列号或密码错误
        ///     2、	序列号未注册
        ///     3、	余额不足
        /// 101、115	网络故障
        /// 100	序列号码为空或无效
        /// 102	短信发送失败，因为部分手机号码不正确
        /// 107	手机号码为空或者超过1000个
        /// 108	手机号码分割符号不正确
        /// 110	短信内容为空或超长
        /// 113、122	调用接口失败
        /// 114	得到标识错误
        /// 125	初始化通讯SOCKET失败
        /// 126	获取响应值失败
        /// 998	超时(长时间没有得到响应消息)
        /// </returns>
        [DllImport("EUCPComm.dll", EntryPoint = "SendSMS")]  //即时发送
        public static extern int SendSMS(string sn, string mn, string ct, string priority);

        /// <summary>
        /// 查询余额
        /// 获得序列号当前余额
        /// </summary>
        /// <param name="m">软件序列号</param>
        /// <param name="balance">返回的余额(10个字节),使用时必须先分配内存</param>
        /// <returns>
        /// 1	成功
        /// 3	超时
        /// 12	查询余额失败
        /// 101、115	网络故障
        /// 100	序列号码为空或无效
        /// 105	参数balance指针为空
        /// 113、122	调用接口失败
        /// 114	得到标识错误
        /// 125	初始化通讯SOCKET失败
        /// </returns>
        [DllImport("EUCPComm.dll", EntryPoint = "GetBalance", CallingConvention = CallingConvention.Winapi)]
        public static extern int GetBalance(string m, System.Text.StringBuilder balance);

        /// <summary>
        /// 发送即时短信。
        /// 发送短信到EUCP平台 (EUCP平台收到短信数据后，即时提交到短信网关) , 支持单发、群发。
        /// </summary>
        /// <param name="sn">软件序列号</param>
        /// <param name="mn">手机号码(群发时，建议最多一次发送200个手机号码之内,号码间用逗号分隔)</param>
        /// <param name="ct">短信内容(最多500个汉字或1000个纯英文，emay服务器程序能够自动分割；亿美有多个通道为客户提供服务，所以分割原则采用最短字数的通道为分割短信长度的规则，请客户应用程序不要自己分割短信以免造成混乱)</param>
        /// <param name="priority">优先级。可以定义1-5 共5个级别的优先级，其中1为最低优先级，5为最高优先级。</param>
        /// <param name="flag">发送状态代码。1为成功发送</param>
        /// <param name="message">发送状态消息</param>
        public static void SendSMS(string sn, string mn, string ct, string priority, out int flag, out string message)
        {
            flag = EUCPComm.SendSMS(sn, mn, ct, priority);
            switch (flag)
            {
                case 1: message = "成功"; break;
                case 17: message = "发送短信失败。可能由于：序列号或密码错误；序列号未注册；余额不足"; break;
                case 101: message = "网络故障"; break;
                case 115: message = "网络故障"; break;
                case 100: message = "序列号码为空或无效"; break;
                case 102: message = "短信发送失败，因为部分手机号码不正确"; break;
                case 107: message = "手机号码为空或者超过1000个"; break;
                case 108: message = "手机号码分割符号不正确"; break;
                case 110: message = "短信内容为空或超长"; break;
                case 113: message = "调用接口失败"; break;
                case 122: message = "调用接口失败"; break;
                case 114: message = "得到标识错误"; break;
                case 125: message = "初始化通讯SOCKET失败"; break;
                case 126: message = "获取响应值失败"; break;
                case 998: message = "超时(长时间没有得到响应消息)"; break;
                default: message = "其他故障"; break;
            }
             
        }

        /// <summary>
        /// 查询单价
        /// </summary>
        /// <param name="sn">软件序列号</param>
        /// <param name="flag">发送状态代码。1为成功发送</param>
        /// <param name="message">状态消息</param>
        /// <returns></returns>
        public static float GetPrice(string sn, out int flag, out string message)
        {
            System.Text.StringBuilder price = new System.Text.StringBuilder("0000000000");
            flag = EUCPComm.GetPrice(sn, price);
            switch (flag)
            {
                case 1: message = "成功"; break;
                case 0: message = "失败"; break;
                case 101: message = "网络故障"; break;
                case 102: message = "其它故障"; break;
                case 100: message = "序列号码为空或无效"; break;
                case 105: message = "参数balance指针为空"; break;
                default: message = "其他故障"; break;
            }
            string myprice = price.ToString(0, price.Length);
            return float.Parse(myprice);
        }

        /// <summary>
        /// 以系统设置【TB_MallSmsPort】中短信SN，5级优先级，发送短信
        /// </summary>
        /// <param name="mn">手机号码(群发时，建议最多一次发送200个手机号码之内)</param>
        /// <param name="ct">短信内容(最多500个汉字或1000个纯英文，emay服务器程序能够自动分割；亿美有多个通道为客户提供服务，所以分割原则采用最短字数的通道为分割短信长度的规则，请客户应用程序不要自己分割短信以免造成混乱)</param>
        /// <param name="flag">发送状态代码。1为成功发送</param>
        /// <param name="message">发送状态消息</param>
        public static void SendSMS(string  mn, string ct, out int flag, out string message)
        {
            //序列号：0SDK-EAA-0130-NDWSL
            string sn = "0SDK-EAA-0130-NDWSL";
            SendSMS(sn, mn, ct, "5", out flag, out message);
           // SendSMS(getSN(), mn, ct, "5", out flag, out message);
            if (flag != 1)
            {
                alertmessageAndGoback("手机短信接口异常!");
            }
        }

        /// <summary>
        /// 查询余额
        /// 获得序列号当前余额
        /// </summary>
        /// <param name="m">软件序列号</param>
        /// <param name="balance">返回的余额(10个字节),使用时必须先分配内存</param>
        /// <param name="flag">发送状态代码。1为成功发送</param>
        /// <param name="message">发送状态消息</param>
        public static void GetBalance(string m, System.Text.StringBuilder balance, out int flag, out string message)
        {
            flag = EUCPComm.GetBalance(m, balance);
            switch (flag)
            {
                case 1: message = "成功"; break;
                case 12: message = "查询余额失败"; break;
                case 101: message = "网络故障"; break;
                case 115: message = "网络故障"; break;
                case 100: message = "序列号码为空或无效"; break;
                case 105: message = "参数balance指针为空"; break;
                case 113: message = "调用接口失败"; break;
                case 122: message = "调用接口失败"; break;
                case 114: message = "得到标识错误"; break;
                case 125: message = "初始化通讯SOCKET失败"; break;
                default: message = "其他故障"; break;
            }
        }

        /// <summary>
        /// 以系统设置【TB_MallSmsPort】中短信SN取余额
        /// </summary>
        /// <param name="flag">发送状态代码。1为成功发送</param>
        /// <param name="message">发送状态消息</param>
        /// <returns></returns>
        //public static float GetBalance(out int flag, out string message)
        //{
        //    System.Text.StringBuilder balance = new System.Text.StringBuilder("0000000000");
        //    GetBalance(getSN(), balance, out flag, out message);
        //    string mybalance = balance.ToString(0, balance.Length);
        //    return float.Parse(mybalance);
        //}

        /// <summary>
        /// 以系统设置【TB_MallSmsPort】中短信SN取剩余可发条数
        /// </summary>
        /// <returns></returns>
        //public static int GetCountNow(out float price, out float balance)
        //{
        //    int c = 0;
        //    int flag;
        //    string message;
        //    price = 0;
        //    balance = 0;
        //    price = EUCPComm.GetPrice(getSN(), out flag, out message);
        //    if (flag == 1)
        //    {
        //        balance = EUCPComm.GetBalance(out flag, out message);
        //        if (flag == 1)
        //        {
        //            c = (int)(balance / price);
        //        }
        //    }
        //    return c;
        //}

        public static string getSN()
        {
            BLL.BllMallSmsPort bll = new BLL.BllMallSmsPort();
            Model.MallSmsPort m = bll.Get();
            return m.SN;
        }
        public static  void alertmessageAndGoback(string message)
        {
            System.Web.HttpContext.Current.Response.Write("<script type=\"text/javascript\">alert('" + message + "');history.go(-1);</script>");
        }
    }
